package com.itserver.aop;

import com.itserver.pojo.Result;
import com.itserver.utils.Config;
import com.itserver.utils.RequestHeader;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


@Slf4j
@Aspect
@Component

public class operateAspect {
    @Autowired
    private Config config;
    // 定义切点，拦截 com.itserver.controller 包下的所有方法
    @Pointcut("@annotation(com.itserver.ano.Log)")
    public void logPointcut() {}

    // 定义切点 更新用户信息
    @Pointcut("@annotation(com.itserver.ano.UpdateUser)")
    public void updateUser() {}
    // 环绕通知
    @Around("!updateUser() && execution(* com.itserver.controller.sysController.*.*(..)) || execution(* com.itserver.controller.article.ArticleCateController.*(..)) || logPointcut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{
        // 非演示模式 不拦截
        if (config.getMode() == null || !config.getMode().equals("demo")){
            return  joinPoint.proceed(); // 执行目标方法
        }
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        String methodType = "" ;
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            // 获取请求认证信息
            Claims claims = RequestHeader.getUserInfo();
            // 判断角色 中是否包含 管理员角色 包含4的
            if (claims!=null && claims.get("roles") != null && claims.get("roles").toString().contains("4")){
                return  joinPoint.proceed(); // 执行目标方法
            }
            // 获取请求方法
            methodType = request.getMethod();
        }
        log.info("controller目标方法执行了：{}",joinPoint.getSignature().getName());
        log.info("methodType：{}",methodType);
        // 演示模式下 不是get请求 拦截
        if(!methodType.equals("GET") ){
            return Result.error("演示模式,禁止该操作!",500);
        }
        return  joinPoint.proceed(); // 执行目标方法
    }
}